BigQueryのCREATE TABLE LIKEステートメントで、同じメタデータのテーブルにふたつのテーブルをまとめてみる
データアナリティクス事業本部の鈴木です。
BigQueryのCREATE TABLE LIKE
ステートメントで、もとのテーブルと同じメタデータのテーブルに、ふたつのテーブルのデータをまとめる検証をしてみました。
CREATE TABLE LIKEステートメントについて
CREATE TABLE LIKE
ステートメントについては、記事執筆時点で、以下のドキュメントに別のテーブルの同じメタデータをすべて含む新しいテーブルを作成します。
の記載があります。
単純にCTASするとメタデータは新しいテーブルに反映されませんが、CREATE TABLE LIKE
ステートメントとas query_statement
句を併せて使用することで、メタデータはもとのテーブルと同じものを設定しつつ、そのテーブルにデータを追加することができます。
このステートメントは、CREATE TABLE ステートメントのバリアントであり、同じ制限事項があります。列リストの代わりに LIKE 句を使用する点を除き、構文は CREATE TABLE 構文と同じです。
CREATE TABLE LIKE ステートメントは、ソーステーブルのメタデータのみをコピーします。as query_statement 句を使用することで、新しいテーブルにデータを追加できます。
※上記ドキュメントより2023/03/13に引用しました。
データの準備
以前別のブログで使った、簡単なフルーツの価格のデータを持った2テーブルをまとめます。
-- もとのテーブル CREATE TABLE sample_dataset.original_table ( id INTEGER OPTIONS(description="商品ID"), name STRING OPTIONS(description="商品名"), price INTEGER OPTIONS(description="商品価格") ); INSERT sample_dataset.original_table (id, name, price) VALUES(1, 'Apple', 150), (2, 'Orange', 120), (3, 'Grape', 390); -- 追加したいデータの入ったテーブル CREATE TABLE sample_dataset.additional_data_table ( id INTEGER OPTIONS(description="商品ID"), name STRING OPTIONS(description="商品名"), price INTEGER OPTIONS(description="商品価格") ); INSERT sample_dataset.additional_data_table (id, name, price) VALUES(3, 'Grape', 390), (4, 'Pineapple', 400), (5, 'Peach', 350);
今回は意地悪なケースで、追加したいデータの入ったテーブルには、もとのテーブルに入っているのと同じデータが1件入っているので、忘れず重複の排除をしたいところです。
SQLを実行して、以下のようにテーブルを作成しました。
メタデータとしては以下のように説明がついています。
方針
まずALTER
文で大元のテーブルのテーブル名を変更します。
その後、CREATE TABLE LIKEステートメントで名前を変更したもとのテーブルのメタデータを引き継いだ新しいテーブルを作成します。データはas query_statement句
を使って、2テーブルのデータを合わせたものを追加します。このとき、念の為テーブル間のデータ重複がないよう、UNION DISTINCT
でデータを結合します。
やってみた
同じデータセット内でテーブルをまとめる
BigQueryのコンソールから操作しました。
まず、クエリエディタから以下のSQL文を入力し、実行
を押しました。
-- もとのテーブルの名前を変更する ALTER TABLE sample_dataset.original_table RENAME TO original_table_bk;
リロードすると以下のようにテーブル名が変わったことを確認できました。
次に、以下のSQL文を実行して、もとのテーブルと同じメタデータのテーブルを作成し、さらに2テーブルのデータを格納しました。
-- 名前変更後のもとのテーブルと同じメタデータで、 -- 2テーブルを合わせたデータを持った新しいテーブルを作成する CREATE TABLE sample_dataset.original_table LIKE sample_dataset.original_table_bk AS SELECT id, name, price FROM sample_dataset.original_table_bk UNION DISTINCT SELECT id, name, price FROM sample_dataset.additional_data_table
以下のように新しいテーブルができました。
スキーマおよびメタデータがもとのテーブルと同じですね。
データも2テーブル分入っていることが確認できます。重複も解消されています。
最後にもとのテーブルを削除しておきます。
-- 名前変更後のもとのテーブルを削除する DROP TABLE sample_dataset.original_table_bk
これでデータセット配下にあるテーブルの名前は元通りになりましたね。
同じロケーションの異なるデータセット内でテーブルをまとめる
気になったのでデータセットを跨いだCREATE TABLE LIKE
ステートメントも試してみました。
additional_data_table
はsample_dataset2
データセットに作ります。ただし、データセットのロケーションは両方asia-northeast1
です。
以下のSQL文を順番に実行しました。(結果が分かりやすいよう、最後のもとのテーブルの削除は省きました。)
-- もとのテーブルの名前を変更する ALTER TABLE sample_dataset.original_table RENAME TO original_table_bk; -- 名前変更後のもとのテーブルと同じメタデータで、 -- 2テーブルを合わせたデータを持った新しいテーブルを作成する CREATE TABLE sample_dataset.original_table LIKE sample_dataset.original_table_bk AS SELECT id, name, price FROM sample_dataset.original_table_bk UNION DISTINCT SELECT id, name, price FROM sample_dataset2.additional_data_table
以下のように、データセットが同じときと同様に処理が実行できました。
最後に
今回はBigQueryのCREATE TABLE LIKEステートメントで、もとのテーブルと同じメタデータのテーブルに、ふたつのテーブルのデータをまとめてみました。
仕様変更のため新旧のデータセットを整理するような時に使えそうですが、メタデータは同じになるのかなど不安に思ったので、実際に試してみて同じスキーマおよびメタデータでテーブルを作れることが確認できたのでよかったです。